// 函数类型：由于在 JavaScript 中函数是一个值！
// 所以在 TypeScript 中函数就需要有一个类型来进行约束！

function plus(a: number, b: number): number {
  return a + b;
}

function mul(a: number, b: number): number {
  return a * b;
}

function sum(...args: number[]): number {
  return args.reduce((prev, cur) => prev + cur, 0);
}

function print(x: number | string): void {
  console.log(x);
}

// 通用的函数类型是 Function ！
let fn: Function = plus;
fn = mul;
fn = sum;
fn = print; // 不会发生检查错误！

// (a: number, b: number) => number 是函数签名，也是就函数类型！
let fn1: (a: number, b: number) => number = plus;
fn1 = mul;
fn1 = print; // 由于函数签名不一致导致检查错误

// 使用 interface 来定义函数类型
interface InterfaceFnType {
  (a: number, b: number): number;
}

let fn2: InterfaceFnType = plus;
fn2 = mul;
fn2 = print; 